/**
 * 顺序表
 */
import java.util.Arrays;
public class MyArrayList implements IList {
    public int[] elem;//数组
    public int usedSize;//数组大小
    public static final int DEFAULT_CAPACITY = 5;
    public MyArrayList() {//构造方法
        elem = new int[DEFAULT_CAPACITY];
    }

    /**
     * 遍历顺序表
     */
    public void display() {
        for(int i = 0;i < this.usedSize;i++) {
            System.out.println(elem[i] + " ");
        }
        System.out.println();
    }

    /**
     * 添加元素,默认插入到最后位置
      * @param data
     */
    public void add(int data) {
        //判满
        if(isFull()) {
            Arrays.copyOf(this.elem,this.elem.length * 2);
        }
        //添加元素
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

    /**
     * 判满
     * @return
     */
    public boolean isFull() {
        return this.usedSize == this.elem.length;
    }
    /**
     * 给pos位置,插入元素
     */
    public void add(int pos,int data) {
        //判断pos位置是否合法
        checkPosOfAdd(pos);
        //判满
        if(isFull()){
            Arrays.copyOf(this.elem,2 * this.elem.length);
        }
        //位置后移
        for(int i = this.usedSize - 1;i >= pos;i--) {
            this.elem[i + 1] = this.elem[i];
        }
        //pos位置,插入data
        this.elem[pos] = data;

        this.usedSize++;
    }
    private void checkPosOfAdd(int pos) {
        if(pos < 0 || pos > this.usedSize) {
            throw new PosException("pos位置为: " + pos);
        }
    }
    /**
     * 查找元素是否存在
     */
    public boolean contains(int toFind) {
            for(int i = 0;i < this.usedSize;i++) {
                if(this.elem[i] == toFind) {
                    return true;
                }
            }
            return false;
        }
    /**
     * 查找元素,并返回下标
     */
    public int indexOf(int toFind) {
        for(int i = 0;i < this.usedSize;i++) {
            if(this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }
    /**
     * 获取pos位置的值
     */
    public int get(int pos) {
        //判断pos位置
        checkPosOfGet(pos);
        //判断是否为空
        if(isEmpty())  {
            throw new EmptyException("顺序表为空!");
        }
        return this.elem[pos];
    }
    private void checkPosOfGet(int pos) {
        if(pos < 0 || pos >= this.usedSize) {
            throw new PosException("pos位置为: " + pos);
        }
    }
    public boolean isEmpty() {
        return this.usedSize == 0;
    }
    /**
     * 更新pos位置
     */
    public void set(int pos,int value) {
        //判断pos是否合理
        checkPosOfGet(pos);
        //判断顺序表是否为空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空!");
        }
        //更新
        this.elem[pos] = value;
    }
    /**
     * 删除remove这个数字
     */
    public void remove(int toRemove) {
        //判空
        if(isEmpty()) {
            throw new EmptyException("顺序表为空!");
        }
        //找到toRemove位置的值
        int index = indexOf(toRemove);
        //覆盖toRemove位置的值
        for(int i = index;i < this.usedSize - 1;i++) {
            this.elem[i] = this.elem[i + 1];
        }
        usedSize--;
    }
    /**
     * 求顺序表长度
     */
    public int size() {
        return this.usedSize;
    }
    /**
     * 清空顺序表,防止内存泄漏
     */
    public void clear() {
        this.usedSize = 0;
    }
}
